package org.thirdHero.wx.service;

import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import org.thirdHero.wx.request.WxPayUnifiedOrderSharingRequest;
import org.thirdHero.wx.request.WxProfitSharingAddReceiverRequest;
import org.thirdHero.wx.request.WxProfitSharingRequest;
import org.thirdHero.wx.response.WxProfitSharingAddReceiverResult;
import org.thirdHero.wx.response.WxProfitSharingResult;

import java.util.Map;

/**
 * <pre>
 * 微信分账相关接口
 * Created by Binary Wang on 2016/7/28.
 * </pre>
 *
 */
public interface WxSharingService {

    /**
     * <pre>
     * 添加分账接收方(详见https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_3&index=4)
     * 商户发起添加分账接收方请求，后续可通过发起分账请求将结算后的钱分到该分账接收方。
     * </pre>
     * @param req 请求对象，注意一些参数如appid、mchid等不用设置，方法内会自动从配置对象中获取到（前提是对应配置中已经设置）
     */
    WxProfitSharingAddReceiverResult profitSharingAddReceiver(WxProfitSharingAddReceiverRequest req) throws WxPayException;

    /**
     * <pre>
     * 单次分账请求按照传入的分账接收方账号和资金进行分账，同时会将订单剩余的待分账金额解冻给本商户。故操作成功后，订单不能再进行分账，也不能进行分账完结。
     * </pre>
     * @param req 请求对象，注意一些参数如appid、mchid等不用设置，方法内会自动从配置对象中获取到（前提是对应配置中已经设置）
     */
    WxProfitSharingResult profitSharing(WxProfitSharingRequest request) throws WxPayException;
    /**
     * 该接口调用“统一下单”接口，并拼装发起支付请求需要的参数
     * 详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
     *
     * @param request 请求对象，注意一些参数如appid、mchid等不用设置，方法内会自动从配置对象中获取到（前提是对应配置中已经设置）
     */
    Map<String, String> getPayInfo(WxPayUnifiedOrderSharingRequest request) throws WxPayException;
    /**
     * 统一下单(详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)
     * 在发起微信支付前，需要调用统一下单接口，获取"预支付交易会话标识"
     * 接口地址：https://api.mch.weixin.qq.com/pay/unifiedorder
     *
     * @param request 请求对象，注意一些参数如appid、mchid等不用设置，方法内会自动从配置对象中获取到（前提是对应配置中已经设置）
     */
    WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderSharingRequest request) throws WxPayException;
    /**
     * 获取配置
     */
    WxPayConfig getConfig();

    /**
     * 设置配置对象
     */
    void setConfig(WxPayConfig config);
}
